function [best_anser,Every_sit,tool_loc,sus_fail]=problem_2(process,change,speed,wash)
% 对不同组 两道工序的解决
%参数分别为 加工 上下件 移动 清洗用时

change=repmat(change,1,4);

Every_sit=cell(1,1);%保存每种刀具分布的结果
sus_fail=[];%保存每种可能的加工成功和失败结果
tool_loc=[];%保存全部刀具位置分布

%% 循环遍历254种刀具位置可能性
for i=1:7
    type=nchoosek(1:8,i);
    
    %% 确定一种刀具分布的可能性
    for j=1:size(type,1)
        tool=ones(1,8);%tool是一种刀具位置分布可能性
        for k=1:size(type(j,:),2)
            tool(type(j,k))=2;
        end
        tool_loc=[tool_loc;tool];
        pos=1;
        time_remaining=zeros(1,8);%八个CNC完成当前工作剩余时间
        if_have=zeros(1,8);%记录CNC当前是否有工件
        t=0;
        expect_t=ones(4,8);%预计时间 分别为预计移动时间 预计等待时间 预计上下件时间 三者和
        save_now=[]; %用于记录当前刀具分布计算结果
        goal=1;%目标工序
        
        %% 计算这种刀具的加工结果
        while t<=28800
            
            
            for k=1:8%计算预计时间
                if goal~=tool(k)
                    expect_t(:,k)=inf;
                    continue;
                end
                expect_t(1,k)=speed(1+abs(pos-ceil(k/2)));
                if time_remaining(k)<=expect_t(1,k)
                    expect_t(2,k)=0;
                else
                    expect_t(2,k)=time_remaining(k)-expect_t(1,k);
                end
                expect_t(3,k)=change(k);
                expect_t(4,k)=sum(expect_t((1:3),k));
            end
            
            %寻找当前工序的下一个目标位置，并移动至该位置
            [~,min_num]=min(expect_t(4,:));
            t=t+expect_t(1,min_num)+expect_t(2,min_num);
            
            % 不同工序处理方式
            if goal==1%目标工序为1
                flag=0;
                for k=size(save_now,1):-1:1
                    %上料又下料
                    if save_now(k,1)==min_num && isnan(save_now(k,3))
                        flag=1;
                        save_now(k,3)=t;
                        save_now(end+1,1)=min_num;
                        save_now(end,2)=t;
                        save_now(end,3:6)=NaN;
                        break;
                    end
                end
                %仅上料
                if flag==0
                        save_now(end+1,1)=min_num;
                        save_now(end,2)=t;
                        save_now(end,3:6)=NaN;
                end
                %取下工序1的工件
                if if_have(min_num)==1
                    goal=2;
                    NEXT=k;%记录当前工件序号
                end
                
                if_have(min_num)=1;
                t=t+expect_t(3,min_num);%完成一次换料
                
                %更新当前工件剩余工作时间
                for k=1:8
                    if time_remaining(k)-expect_t(4,min_num)<0
                        time_remaining(k)=0;
                    else
                        time_remaining(k)=time_remaining(k)-expect_t(4,min_num);
                    end
                end
                
            time_remaining(min_num)=process(1);    
            else %目标工序为2
                flag=0;
                     for k=size(save_now,1):-1:1%记录本次操作时刻
                         if save_now(k,4)==min_num && isnan(save_now(k,6))%取下已完成工件
                            flag=1;
                            save_now(k,6)=t;
                            save_now(NEXT,4)=min_num;
                            save_now(NEXT,5)=t;
                         break;
                         end
                     end
                    
                % 放置等待加工 工序2的工件
                if flag==0
                    save_now(NEXT,4)=min_num;
                    save_now(NEXT,5)=t;
                end
                goal=1;
                
                if_have(min_num)=1;
                t=t+expect_t(3,min_num)+wash;
                
                % 更新当前工件剩余工作时间
                for k=1:8
                    if time_remaining(k)-expect_t(4,min_num)-wash<0
                        time_remaining(k)=0;
                    else
                        time_remaining(k)=time_remaining(k)-expect_t(4,min_num)-wash;
                    end
                end
                time_remaining(min_num)=process(2)-wash;
            end
            pos=ceil(min_num/2);
        end
        %% 结果保存
       Every_sit=[Every_sit,save_now];% 保存当前刀具分布结果
       sus_fail=[sus_fail;0,0];%记录当前刀具分布下成功工件和失败工件数量
       
       for k=1:size(save_now,1)%size(save_now,1) 表示总共的工件数量
            if isnan(sum(save_now(k,:)))
                sus_fail(end,2)=sus_fail(end,2)+1;%失败
            else
                sus_fail(end,1)=sus_fail(end,1)+1;%成功
            end
       end    
    end
end
    
%% 结果分析
Every_sit(1)=[];
max_tool=max(sus_fail(:,1));%最大产量
all_time=inf;%最大产量完成用时
best_plan=cell(1,1);%最好的结果
best_tool_loc=[];%最好的刀具分布情况

%寻找最大常量情况下的最少用时
for i=1:size(Every_sit,2)
    if sus_fail(i,1)==max_tool
        for j=size(Every_sit{1,i},1):-1:1
            if ~isnan(Every_sit{1,i}(j,6))
                if Every_sit{1,i}(j,6)<=all_time
                    all_time=Every_sit{1,i}(j,6);%更新最大产量完成用时
                end
                break;
            end
        end
    end
end

%寻找最优情况
for i=1:size(Every_sit,2)
    if sus_fail(i,1)==max_tool
        for j=size(Every_sit{1,i},1):-1:1
            if ~isnan(Every_sit{1,i}(j,6))
                if Every_sit{1,i}(j,6)==all_time
                best_plan=[best_plan,Every_sit{1,i}];
                best_tool_loc=[best_tool_loc;tool_loc(i,:)];
                end
            end
        end
    end
end
best_plan(1)=[];
best_anser=best_plan{1,end};%挑选一个最佳方案

end